/**
 * 网络请求
 */
import Taro from '@tarojs/taro';
import Config from '../config/index';

/**
 * get请求
 * @param url 地址
 */
function get(url: string, data?: Object) {
  return new Promise((resolve, reject) => {
    request(url + (data ? params(data) : ''), 'GET')
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * post请求
 * @param url 地址
 * @param data 参数
 */
function post(url: string, data: Object) {
  return new Promise((resolve, reject) => {
    request(url, 'POST', data)
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * put请求
 * @param url 地址
 * @param data 参数
 */
function put(url: string, data: Object) {
  return new Promise((resolve, reject) => {
    request(url, 'PUT', data)
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * delete请求
 * @param url 地址
 * @param data 参数
 */
function del(url: string, data: Object) {
  return new Promise((resolve, reject) => {
    request(url, 'DELETE', data)
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
}

/**
 * 参数拼接
 * @param data 参数
 */
function params(data: any) {
  let value = '?';
  for (const i in data) {
    value += `${i}=${data[i]}&`;
  }
  return value.substring(0, value.length - 1);
}
/**
 * 公共方法
 * @param url 地址
 * @param method 请求方法
 * @param data 参数
 * @param headerOption 请求头
 */
function request(url: string, method: any, data?: Object, headerOption?: any) {
  return new Promise((resolve, reject) => {
    Taro.request({
      url: Config.baseUrl + url,
      method,
      header: headerOption ? headerOption : { 'content-type': 'application/json' },
      data,
    })
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
}

export default { get, post, put, del };
